package org.usmile.algorithms.leetcode.middle;

import java.util.Arrays;

/**
 * 剑指 Offer 45. 把数组排成最小的数
 * <p>
 * 输入一个非负整数数组，把数组里所有数字拼接起来排成一个数，打印能拼接出的所有数字中最小的一个。
 * <p>
 * 示例 1:
 * <p>
 * 输入: [10,2]
 * 输出: "102"
 * <p>
 * 示例 2:
 * <p>
 * 输入: [3,30,34,5,9]
 * 输出: "3033459"
 * <p>
 * <p>
 * 提示:
 * <p>
 * 0 < nums.length <= 100
 * 说明:
 * <p>
 * 输出结果可能非常大，所以你需要返回一个字符串而不是整数
 * 拼接起来的数字可能会有前导 0，最后结果不需要去掉前导 0
 */
public class Offer_045 {
}

class Offer_045_Solution {
    public String minNumber(int[] nums) {
        if (nums == null || nums.length == 0) {
            return "0";
        }

        String[] stringNums = new String[nums.length];
        for (int i = 0; i < nums.length; i++) {
            stringNums[i] = nums[i] + "";
        }

        Arrays.sort(stringNums, (o1, o2) -> {
            String x = o1 + o2;
            String y = o2 + o1;
            return x.compareTo(y);
        });

        StringBuilder sb = new StringBuilder();
        for (String num : stringNums) {
            sb.append(num);
        }

        return sb.toString();
    }
}